视频加载失败

JS函数内部的[[scope]]属性

438 字
2 分钟
JS函数内部的[[scope]]属性

[[scope]]#

函数内部的[[scope]]属性是虚拟出来的一个属性,我们实际访问时访问不到这个属性的,这个属性是为了让我们更好的理解函数,虚拟出来的一个属性。

var fun1,fun2;
function foo() {
var x = 10;
fun1 = function () {
console.log(++x);//11 x=11
};
fun2 = function () {
console.log(--x);//10 x=10
}
}
foo(); // 初始化了fun1,fun2函数
fun1(); // 11
fun2(); // 10
  • 产生这个情况的原因是<在同一父作用域中的闭包共同同一个>[[scope]]属性
var x = 10;
function foo () {
console.log(x);
}
foo(); // 10
function fun () {
var x = 20;
var foo1 = foo;
foo1(); // 10
}
fun();
  • 是10的原因就是在复制函数的时候,复制后的函数与复制前的函数引用的是同一个[[scope]]属性,由于foo的[[scope]]属性中的x是保存在函数父作用域链中的,这个也就是指的全局的变量对象(也就是全局变量)中的x,foo1中[[scope]]属性与foo的相同,所以foo1在执行创建的scope,只有foo1内部的[[scope]]属性(也就是foo内部的[[scope]]属性),所以在查找原型链时,foo1作用域链就直接查找到了全局对象中的x属性,所以会返回10。

  • [[Scope]]和执行期上下文虽然保存的都是作用域链,但不是同一个东西

  • [[Scope]]属性是函数创建时产生的,会一直存在;而执行上下文在函数执行时产生,函数执行结束便会销毁

  • 伪代码:foo函数创建产生[[Scope]]对象

foo.[[Scope]] = {
GO: {
this: window ,
window:... ,
document: ... ,
a: undefined, //预编译阶段还不知道a的值是多少,执行过程中会修改
foo: function(){...},
......
}
}

详细了解推荐地址:http://www.2cto.com/kf/201312/263748.html

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
JS函数内部的[[scope]]属性
https://gaodaxiu-blog.netlify.app/posts/JS函数内部的[[scope]]属性/
作者
GaoDaXiu
发布于
2017-09-05
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
GaoDaXiu
Hello, I'm GaoDaXiu.
公告
欢迎来到我的博客!
分类
标签
最新动态
站点统计
文章
76
分类
20
标签
128
总字数
72,109
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Netlify CI
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录